from typing import List, Dict, Any
from app.crud.analysis import AnalysisCRUD
from app.core.config import get_database

from openai import AsyncOpenAI

#  解决中文乱码
import sys
sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf-8', buffering=1)

class AnalysisService:
    def __init__(self):
        self.db = get_database()
        self.crud = AnalysisCRUD(self.db)
        self.client = AsyncOpenAI(
                #api_key
                api_key="sk-a28154563b124056bf0e764c6db6eb7a",  
                base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
            )

    async def  get_all_events(self) -> List[Dict[str, Any]]:
        """
        获取所有事件
        """
        return await self.crud.find_all_events()

    async def get_comments_by_id(self, e_id: int) -> List[Dict[str, Any]]:
        """
        根据事件ID获取评论
        """
        return await self.crud.find_comments_by_event_id(e_id)

    async def get_articles_by_id(self, e_id: int) -> List[Dict[str, Any]]:
        """
        根据事件ID获取文章
        """
        return await self.crud.find_articles_by_event_id(e_id) 
    
    async def event_info_expand(self,event_id:  int) -> Dict[str, Any]:
        event=await self.crud.find_one_event(event_id)

        event["description"]=await self.EventDecsriptionExpand(event["title"],event["description"])
        event["type"]=await self.EventTypeSortByDeepSeek(event["title"],event["description"])
        event["keywords"]=await self.GetEventKeyWords(event["title"],event["description"])
        event["hotwords"]=await self.GetEventTopics(event["title"],event["description"])

        event["eventstate"]=2
        await self.crud.update_one_event(event_id,event)
        event["_id"] = str(event["_id"])
        return event
    # 事件类型分类
    async def EventTypeSortByDeepSeek(self,title: str,description: str) -> str:
        #上下文信息
        assistant='你接下来会收到一段以(title|description)为格式的文本，其中title是这个事件标题，description是事件简述，这你根据这两个信息判断出这个事件是属于音乐、科技、股市、政策、游戏、运动、学术、军事、娱乐和影视这些类中的哪一类，你是要回答哪一类就行了，如输出：音乐，不要有多余的话。'
        #输入
        content=f'({title}|{description})'
        completion = await self.client.chat.completions.create(
            model="deepseek-v3",  #deepseek-v3
            messages=[
                {'role': 'assistant', 'content': assistant},
                {'role': 'user', 'content': content}
            ]
        )
        return completion.choices[0].message.content
    
    # 事件简述扩展
    async def EventDecsriptionExpand(self,title: str,description: str) -> str:
        #上下文信息
        assistant='你接下来会收到一段以(title|description)为格式的文本，其中title是这个事件标题，description是事件简述，你需要将这个事件简述进行扩展，使其更长一些，用中文回答大约150至200个字就行，直接输出扩展后的事件简述就行,不要有多余的话。'
        #输入
        content=f'({title}|{description})'
        completion = await self.client.chat.completions.create(
            model="deepseek-v3",  #deepseek-v3
            messages=[
                {'role': 'assistant', 'content': assistant},
                {'role': 'user', 'content': content}
            ]
        )
        return completion.choices[0].message.content
    
    # 获取关键词(10个)
    async def GetEventKeyWords(self,title: str,description: str) -> List[str]:
        #上下文信息
        assistant='你接下来会收到一段以(title|description)为格式的文本,其中title是这个事件标题，description是事件简述，请你根据这两个信息生成10个与这个事件有关的中文关键词，直接输出结果就行，每个关键时间用\',\'分隔,相关性越高排越前面，不要有多余的话。'
        #输入
        content=f'({title}|{description})'
        completion = await self.client.chat.completions.create(
            model="deepseek-v3",  #deepseek-v3
            messages=[
                {'role': 'assistant', 'content': assistant},
                {'role': 'user', 'content': content}
            ]
        )
        return completion.choices[0].message.content.split(',')
    
    # 获取事件话题
    async def GetEventTopics(self,title: str,description: str) -> List[str]:
        #上下文信息
        assistant='你接下来会收到一段以(title|description)为格式的文本,其中title是这个事件标题，description是事件简述，请你根据这两个信息生成10个与这个事件有关的话题，每个话题时间用\',\'分隔,直接输出结果就行，越热门排越前面，不要写序号和有多余的话。'
        #输入
        content=f'({title}|{description})'
        completion = await self.client.chat.completions.create(
            model="deepseek-v3",  #deepseek-v3
            messages=[
                {'role': 'assistant', 'content': assistant},
                {'role': 'user', 'content': content}
            ]
        )
        return completion.choices[0].message.content.split(',')